package com.eternallove.core.constants;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.*;

/**
 * 框架级常量
 * @author Eva.Caesar Liu
 * @since 2022/11/30 15:45
 */
public interface Constants {

    /**
     * 缓存Key
     */
    interface CacheKey {
    }

    /**
     * 操作类型，用于做接口验证分组
     */
    interface OperaType {

        /**
         * 创建
         */
        interface Create {}

        /**
         * 修改
         */
        interface Update {}

        /**
         * 修改状态
         */
        interface UpdateStatus {}
    }

    /**
     * Job常量
     */
    interface Job {

        // jobId在JOB实例中的存储参数键
        String JOB_DATA_MAP_JOB_ID = "JOB_ID";

        /**
         * JOB状态
         */
        @Getter
        @AllArgsConstructor
        enum JobStatus {
            PAUSE((byte) -1, "暂停"),
            READY((byte) 0, "已准备"),
            RUNNING((byte) 1, "运行中"),
            ;
            private byte code;
            private String remark;
        }

        /**
         * 分片状态
         */
        @Getter
        @AllArgsConstructor
        enum SnippetStatus {
            READY((byte) 0, "已准备"),
            RUNNING((byte) 1, "运行中"),
            SUCCESS((byte) 2, "执行成功"),
            FAILED((byte) -2, "执行失败"),
            ;
            private byte code;
            private String remark;
        }

        /**
         * 分片状态
         */
        @Getter
        @AllArgsConstructor
        enum LogStatus {
            FAILED((byte) 0, "执行失败"),
            SUCCESS((byte) 1, "执行成功"),
            IGNORE((byte) 2, "跳过"),
            NONE((byte) -1, "执行中"),
            ;
            private byte code;
            private String remark;
        }

        /**
         * 触发类型
         */
        @Getter
        @AllArgsConstructor
        enum TriggerType {
            SYSTEM("SYSTEM", "系统"),
            MANUAL("MANUAL", "手动"),
            ;
            private String code;
            private String remark;
        }
    }

    /**
     * 跟踪日志异常等级
     */
    @Getter
    @AllArgsConstructor
    enum ExceptionLevel {
        DANGER((byte)10, "高"),
        WARN((byte)5, "中"),
        LOW((byte)0, "低"),
        ;

        private byte level;

        private String remark;
    }

    /**
     * MyBatis自动注入忽略
     */
    interface Ignore {
        /**
         * 忽略时间，当不需要更新createTime/updateTime时，可使用该常量进行填充。
         */
        Date IGNORE_TIME = new IgnoreDate();

        /**
         * 忽略用户，当不需要更新createUser/updateUser时，可使用该常量进行填充。
         */
        Integer IGNORE_USER = -1;

        /**
         * 忽略时间类
         */
        class IgnoreDate extends Date {}
    }
}
